package reservas;

import java.util.*;
import usuarios.Usuario;
import asientos.*;

public class Reserva {
	private Vuelo asiento;
	
	private Usuario titular = null;
	
	// la lista debe agregar ordenadamente
	private List<Usuario> usuarios;
	
	public Reserva(Vuelo unAsiento, Usuario unUsuario) {
		this.usuarios = new ArrayList<Usuario>();
		this.setAsiento(unAsiento);
		this.reservar(unUsuario);
	}
	
	private boolean tengoTitular() {
		return this.getTitular() != null;
	}
	
	public void sobrereservar(Usuario unUsuario) {
		if(!this.tengoTitular()) {
			throw new EstadoDeAsientoIncorrectoException();
		}
		this.usuarios.add(unUsuario);
		
		
		//this.asiento.registrarReserva(unUsuario.getDni());
		
	}
	
	public void reservar(Usuario unUsuario) {
		if (this.tengoTitular()) {
			throw new EstadoDeAsientoIncorrectoException();
		}
			
		// la reserva no tiene un titular
		// primera reserva o transferencia
		this.getAsiento().reservar(unUsuario);
			
		// si es una transferencia lo saco de los sobre-reservadores
		if (this.usuarios.contains(unUsuario))
			this.usuarios.remove(unUsuario);
	
		this.setTitular(unUsuario);
	}
		
	public Usuario getTitular() {
		return this.titular;
	}

	public Vuelo getAsiento() {
		return asiento;
	}

	private Usuario getProximoTitular() {
		if (!this.sobreReservada())
			return null;
	
		return this.usuarios.get(0);
	}
	
	private void setAsiento(Vuelo asiento) {
		
		this.asiento = asiento;
	}
	
	public boolean sobreReservada() {
		
		return this.usuarios.size() > 0;
	}
	
	private Usuario quitarTitular() {
		
		Usuario titular = this.getTitular();
		
		this.setTitular(null);
		
		return titular;
	}
	
	public void Transferir() {
		
		if (!this.sobreReservada())
			throw new TransferenciaDeReservaVaciaException();
		
		// lo guardo por si algo anda mal, dejo todo en estado correcto
		Usuario titularViejo = quitarTitular();
		
		try
		{
			this.reservar(this.getProximoTitular());
		}
		catch (RuntimeException ex)
		{
			// le vuelvo a poner el titular para que quede en el estado original
			this.setTitular(titularViejo);
			
			throw ex;
		}
		
	}
	
	@Override
	public boolean equals(Object obj) {

		if (obj == null)
			return false;
		
		if (!obj.getClass().equals(this.getClass()))
			return false;
		
		Reserva unaReserva = (Reserva) obj;
		
		return this.asiento.equals(unaReserva.getAsiento());		
		
	}

	private void setTitular(Usuario titular) {
		this.titular = titular;
	}
}
